<?php

class PicController extends Controller
{

    /**
     * @var string the default layout for the views. Defaults to '//layouts/column2', meaning
     * using two-column layout. See 'protected/views/layouts/column2.php'.
     */
    public $layout = '//layouts/column2';

    /**
     * @return array action filters
     */
    public function filters()
    {
        return array(
            'accessControl', // perform access control for CRUD operations
        );
    }

    /**
     * Specifies the access control rules.
     * This method is used by the 'accessControl' filter.
     * @return array access control rules
     */
    public function accessRules()
    {
        return array(
            array('allow', // allow all users to perform 'index' and 'view' actions
                'actions' => array(''),
                'users' => array('*'),
            ),
            array('allow', // allow authenticated user to perform 'create' and 'update' actions
                'actions' => array('index', 'view', 'create', 'update'),
                'users' => array('@'),
            ),
            array('allow', // allow admin user to perform 'admin' and 'delete' actions
                'actions' => array('admin', 'delete'),
                'users' => array('admin'),
            ),
            array('deny', // deny all users
                'users' => array('*'),
            ),
        );
    }

    /**
     * Displays a particular model.
     * @param integer $id the ID of the model to be displayed
     */
    public function actionView($id)
    {
        $this->render('view', array(
            'model' => $this->loadModel($id),
        ));
    }

    /**
     * Creates a new model.
     * If creation is successful, the browser will be redirected to the 'view' page.
     */
    public function actionCreate()
    {
        $model = new Pic;
        // Uncomment the following line if AJAX validation is needed
        // $this->performAjaxValidation($model);
        if (isset($_POST['Pic']))
        {
            $image = CUploadedFile::getInstances($model, 'big_pic');
            $is_fail = true;
            foreach ($image as $img)
            {
                $model->created_time = date("Y-m-d H:i:s");

                $microtime = microtime(true);
                $model->big_pic = './images/pic/' . $microtime . '.' . $img->extensionName;

                $mini_path = $this->create_mini_pic($img->tempName, $microtime);
                $model->mini_pic = $mini_path;

                $id = $this->auto_id($model);
                $model->id = $id;

                if ($model->save())
                {
                    $is_fail = false;
                    $img->saveAs($model->big_pic);
                }
                else
                    print_r($model->getErrors());
            }

            if (!$is_fail)
            {
                $this->redirect(array('index'));
            }
        }

        $this->render('create', array(
            'model' => $model,
        ));
    }

    /**
     * Updates a particular model.
     * If update is successful, the browser will be redirected to the 'view' page.
     * @param integer $id the ID of the model to be updated
     */
    public function actionUpdate($id)
    {
        $model = $this->loadModel($id);

        // Uncomment the following line if AJAX validation is needed
        // $this->performAjaxValidation($model);

        if (isset($_POST['Pic']))
        {
            $model->attributes = $_POST['Pic'];
            if ($model->save())
                $this->redirect(array('view', 'id' => $model->id));
        }

        $this->render('update', array(
            'model' => $model,
        ));
    }

    /**
     * Deletes a particular model.
     * If deletion is successful, the browser will be redirected to the 'index' page.
     * @param integer $id the ID of the model to be deleted
     */
    public function actionDelete($id)
    {
//        if (Yii::app()->request->isPostRequest)
//        {
        // we only allow deletion via POST request
        if ($this->loadModel($id)->delete())
        {
            // if AJAX request (triggered by deletion via admin grid view), we should not redirect the browser
            if (!isset($_GET['ajax']))
                $this->redirect(array('index'));
//        }
            else
                throw new CHttpException(400, 'Invalid request. Please do not repeat this request again.');
        }
        else
            throw new CHttpException(400, 'delete fail.');
    }

    /**
     * Lists all models.
     */
    public function actionIndex()
    {
        $dataProvider = new EMongoDocumentDataProvider('Pic');
        $pic_data = $dataProvider->getData();
        if(empty($pic_data))
        {
            $pic_data = '<div style="margin:50px;">还没有图片</div>';
        }
        $this->render('index', array(
            'pic_data' => $pic_data,
        ));
    }

    /**
     * Manages all models.
     */
    public function actionAdmin()
    {
        $model = new Pic('search');
        $model->unsetAttributes();

        if (isset($_GET['Pic']))
            $model->setAttributes($_GET['Pic']);

        $this->render('admin', array(
            'model' => $model
        ));
    }

    /**
     * Returns the data model based on the primary key given in the GET variable.
     * If the data model is not found, an HTTP exception will be raised.
     * @param integer the ID of the model to be loaded
     */
    public function loadModel($id)
    {
        $model = Pic::model()->findByPk($id);
        if ($model === null)
            throw new CHttpException(404, 'The requested page does not exist.');
        return $model;
    }

    /**
     * Performs the AJAX validation.
     * @param CModel the model to be validated
     */
    protected function performAjaxValidation($model)
    {
        if (isset($_POST['ajax']) && $_POST['ajax'] === 'pic-form')
        {
            echo CActiveForm::validate($model);
            Yii::app()->end();
        }
    }

    protected function create_mini_pic($image, $name = '')
    {
        header("Content-Type: text/html;charset=utf-8");
//        $mini_width = 181;
        $mini_height = 300;
        $im_info = getimagesize($image);
        switch ($im_info[2])       //判断图片类型
        {
            case 1:
                $src_image = imagecreatefromgif($image);
                break;
            case 2:
                $src_image = imagecreatefromjpeg($image);
                break;
            case 3:
                $src_image = imagecreatefrompng($image);
                break;
            case 6:
                $src_image = imagecreatefrombmp($image);
                break;
        }
        $temp = $mini_height / $im_info[1];
        $new_w = $im_info[0] * $temp;
        $new_h = $mini_height;

        //生成文字水印
//             $mark = imagecolorallocate($mini_image);
//             $text = iconv("gbk", "utf-8", "renlong.ouzhe.com");
//             imagettftext($mini_image, 12, 0, 20, 20, $mark, '黑体', $text);
        $mini_image = imagecreatetruecolor($new_w, $new_h);
//        $mini_bg = imagecolorallocate( $mini_image , 255 , 0 , 0 );
//        imagefill($mini_image, 0, 0, $mini_bg);
        imagecopyresized($mini_image, $src_image, 0, 0, 0, 0, $new_w, $new_h, $im_info[0], $im_info[1]);
        imagepng($mini_image, "images/pic/mini/" . $name . ".png");
        $image_mini_add = "images/pic/mini/" . $name . ".png";
        return $image_mini_add;
    }

    /* mongodb生成自增id
     * @author  RenLong
     * @date  2013-09-25
     * @param  $model
     * @return string
     * 
     * 解决mongodb无自增ID思路：
     * 数据库中查找最新一条记录的ID值，
     * 如ID不存在，赋ID值为1；
     * 如存在，则读取ID值并加1，返回新值。
     * 
     * 第一种写法
     * $criteria = new EMongoCriteria();
     * $criteria->sort('_id', EMongoCriteria::SORT_DESC);
     *
     * 第二种写法
     */

    private function auto_id($model)
    {
        $a = array('sort' => array('_id' => EMongoCriteria::SORT_DESC));
        $criteria = new EMongoCriteria($a);
        $data = $model->findAll($criteria);

        if ($data)
        {
            $id = $data[0]->id;
            $id++;
        }
        else
        {
            $id = 1;
        }

        //必须int转为string，否则$this->loadModel无法查询，返回null.
        return (string) $id;
    }

}
